// 驼峰命名转横杠命名，同时大写变小写
type RemoveFirst<T> = T extends `-${infer L}` ? L : T  // 移除最前面的 - 


// 每次取出大写的字母，变成小写，然后前面加 - ， 最后将第一个 - 移除
type KebabCase<S, Prev extends string = ''> =
    S extends `${infer L}${infer R}`
    ? KebabCase<R, `${Prev}${L extends Uppercase<L>
        ? `-${Lowercase<L>}` : L
        }`> : RemoveFirst<Prev>
type A1 = KebabCase<"HandleOpenFlag">; // handle-open-flag
type A2 = KebabCase<"OpenFlag">; // open-flag

export { };  
